//
//  ViewController.m
//  NSLoop
//
//  Created by admin on 2019/8/17.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//


/*
 
 消息循环
    定义：
     RunLoop就是消息循环，每一个线程内部都有一个消息循环
     只有主线程的消息循环是默认开启的，子线程的消息循环默认是不开启的
 
     启动子线程的消息循环
        [[NSRunLoop currentRunLoop]run];
        线程池的实现原理，就是消息循环。开启线程后永不销毁，（开启子线程很消耗时间，创建一个子线程需要90毫秒）
        当需要让子线程执行新方法的时候，使用performSelect 让指定的方法在指定的子线程上运行。
        GCD是对线程的管理。
 
    作用：
     保证程序不退出
     负责处理输入事件
     如果没有事件发送，会让程序进入休眠状态
 
 输入事件：
    RunLoop接收输入事件来自不同的来源：输入源（input source）和时间源（timer source）
 
 
 
 */
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
#pragma mark - 子线程的消息循环
    
    //创建一个子线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo2) object:nil];
    [thread start];
    
    //向子线程的消息循环中添加输入源
    [self performSelector:@selector(demoTo2) onThread:thread withObject:nil waitUntilDone:NO];
    
    
    
    
}

-(void)demoTo2
{
    NSLog(@"加油啊，猫爷爷的酱醋茶~");
}

-(void)demo2
{
    NSLog(@"向IOS高级工程师努力！");
    //开启子线程的消息循环
    //如果有添加输入事件，消息循环将一直运行 Bingo无法输出
    //如果没有输入源，则不会执行
//    [[NSRunLoop currentRunLoop]run];
    
    //两秒后结束消息消息循环
    [[NSRunLoop currentRunLoop]runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
    NSLog(@"Bingo~");
    
}

#pragma mark - 主线程的消息循环
- (void)mainThreadRunLoopDemo
{
    //创建一个定时器
    //定时器执行的方法中，不易执行太耗时的操作，否则就会降低用户的体验，用户拖拽时会感觉卡顿
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(demo) userInfo:nil repeats:YES];
    
    
    //把定时器添加到当前线程消息循环中 - 如果视图中有scrollView就无法执行
    //    [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
    
    //消息循环是在一个指定的模式下运行的，默认的模式NSDefaultRunLoopMode
    //消息循环的模式必须和输入的事件的模式匹配才会会执行
    
    //消息循环的模式自动改变
    // 当滚动scrollView的时候，模式为UITrackingRunLoopMode
    [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
}

-(void)demo
{
    
    //输出当前消息循环模式
    NSLog(@"加油，猫爷爷的酱醋茶。%@",[NSRunLoop currentRunLoop].currentMode);
    
}
@end
